package com.cetc;

import org.junit.Test;

import java.io.File;
import java.io.IOException;
import java.time.Instant;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * @Classname IOFileTest
 * @Description IO测试
 * @Date 2022/11/23 13:44
 * @Created by louzhuangxi
 */
public class IOFileTest {
    /**
     * File类的三种构造器测试
     * 相对路径：相对于当前module
     * 绝对路径：带盘符的路径
     * 路径分割符：windows:\\  linux:/
     */
    @Test
    public void test01() {
        File file1 = new File("data/hello.txt");
        System.out.println("相对路径file测试：" + file1);
        File file2 = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data/hello.txt");
        System.out.println("绝对路径file测试：" + file2);
        File file3 = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io", "data");
        System.out.println(file3);
        File file4 = new File(file3, "hello.txt");
        System.out.println(file4);
    }

    /**
     * File类的常用方法
     */
    @Test
    public void test02() {
        File file1 = new File("data/hello.txt");
        System.out.println(file1.getName());
        System.out.println(file1.getAbsolutePath());
        System.out.println(file1.getParent());
        System.out.println(file1.getPath());
        System.out.println(file1.length());
        System.out.println(new Date(file1.lastModified()));

        System.out.println();

        File file2 = new File("/Users/louzhuangxi/Desktop/hi.txt");
        System.out.println(file2.getName());
        System.out.println(file2.getAbsolutePath());
        System.out.println(file2.getParent());
        System.out.println(file2.getPath());
        System.out.println(file2.length());
        System.out.println(new Date(file2.lastModified()));
    }

    /**
     * 针对File类的关于文件夹的几个方法测试
     * listFiles():查询某文件夹下的文件File对象列表
     * listFile()：查询某文件夹下的文件File名称列表
     */
    @Test
    public void test03() {
        File file = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data");
        String[] list = file.list();
        for (String name : list) {
            System.out.println(name);
        }
        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println(file1);
        }
    }

    /**
     * File类的renameTo方法测试,不能使用相对路径,且磁盘中目的文件不能存在
     */
    @Test
    public void test04() {
        File sourceFile = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data/hello.txt");
        File targetFile = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data/hi.txt");
        boolean flag = sourceFile.renameTo(targetFile);
        System.out.println(flag);
    }

    /**
     * 测试File类的几个判断方法
     */
    @Test
    public void test05() {
        File sourceFile = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data/hi.txt");
        System.out.println(sourceFile.isDirectory());
        System.out.println(sourceFile.isFile());
        System.out.println(sourceFile.exists());
        System.out.println(sourceFile.canWrite());
        System.out.println(sourceFile.canRead());
        System.out.println(sourceFile.isHidden());
    }

    /**
     * 测试File类创建文件的方法
     */
    @Test
    public void test06() {
        File sourceFile = new File("data/hi.txt");
        if (!sourceFile.exists()) {
            try {
                sourceFile.createNewFile();
                System.out.println("创建成功");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            sourceFile.delete();
            System.out.println("删除成功");
        }
    }

    /**
     * 测试File类创建文件夹的两种方式
     */
    @Test
    public void test07() {
        File file = new File("io1/io2");
        if (!file.exists()) {
            file.mkdir();
            System.out.println("创建成功1");
        }

        File file2 = new File("io1/io2");
        if (!file2.exists()) {
            file2.mkdirs();
            System.out.println("创建成功2");
        }
    }

    /**
     * 利用File构造器，new一个文件目录file
     * 1)在其中创建多个文件和目录
     * 2)编写方法，实现删除file中指定文件的操作
     */
    @Test
    public void test08() {
        File file = new File("data/hello.txt");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
            System.out.println("文件夹创建成功");
        }
        try {
            if (file.createNewFile()) {
                System.out.println("文件创建成功");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        file.delete();
    }

    /**
     * 判断指定目录下是否有后缀名为.jpg的文件，如果有，就输出该文件名称
     */
    @Test
    public void test09() {
        File file = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
            System.out.println("文件夹创建成功");
        }
        for (String fileName : file.list()) {
            if (fileName.endsWith(".jpg")) {
                System.out.println(fileName);
            }
        }
    }

    /**
     * 遍历指定目录所有文件名称，包括子文件目录中的文件。
     * 拓展1：并计算指定目录占用空间的大小
     * 拓展2：删除指定文件目录及其下的所有文件
     */
    @Test
    public void test10() {
        File file = new File("/Users/louzhuangxi/Downloads/java-basic/java-basic-io/data");
        //输出指定目录下所有的文件名称以及子文件目录中的文件
        long length = circulateFileName(file);
        System.out.println("指定文件目录的大小为：" + length);
        //删除指定文件目录下的所有文件
        deleteFiles(file);
        System.out.println("文件删除成功");
    }

    private void deleteFiles(File file) {
        if (!file.exists()) {
            System.out.println("本文件夹不存在");
        }
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                deleteFiles(f);
            }
            f.delete();
        }
    }

    private long circulateFileName(File file) {
        long length = 0L;
        if (!file.exists()) {
            System.out.println("本文件夹不存在");
        }
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                length += circulateFileName(f);
            } else {
                System.out.println("文件名称为：" + f);
                length += f.length();
            }
        }
        return length;
    }
}

